package br.com.bmb.monitorimoveis.servico.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import br.com.bmb.monitorimoveis.GeradorURLsPesquisaWImoveis;
import br.com.bmb.monitorimoveis.entidade.Anuncio;
import br.com.bmb.monitorimoveis.entidade.ResultadoPesquisa;
import br.com.bmb.monitorimoveis.entidade.InfoColeta;
import br.com.bmb.monitorimoveis.parser.WImoveisParser;
import br.com.bmb.monitorimoveis.servico.IColetorAnuncios;

public class ColetaWImoveisService implements IColetorAnuncios {

	public ColetaWImoveisService() {
	}

	/**
	 * Obtem as URLs dos anúncios para que esses anúncios possam ser
	 * coletados posteriormente via requisição http.
	 * @return
	 */
	public List<InfoColeta> coletarURLsAnuncios() {

		List<InfoColeta> urls = new ArrayList<InfoColeta>();

		GeradorURLsPesquisaWImoveis gerador = new GeradorURLsPesquisaWImoveis();

		String url = null;

		while (gerador.temMaisURLs()) {

			url = gerador.proximaURL();

			//urls.addAll(obterURLsAnuncioDoResultadoPesquisaPorListagem(url));
			urls.addAll(obterURLsAnuncioDoResultadoPesquisaPorGaleria(url));
		}

		return urls;
	}
	
	
	private List<InfoColeta> obterURLsAnuncioDoResultadoPesquisaPorGaleria(String url) {
		
		List<InfoColeta> urlsDoResultadoPesquisa = new ArrayList<InfoColeta>();
		
		try {

			int numPaginas = pesquisar(url).getNumPaginas();

			int paginaAtual = 0;

			while (paginaAtual < numPaginas) {

				try {
					System.out.println("************* Obtendo PÁGINA "
							+ (paginaAtual + 1) + " *************");
					Document doc2 = Jsoup.connect(url + paginaAtual).get();
					Thread.sleep(1000);

					Elements tags = doc2.select(".listagem_foto");

					for (Element tag : tags) {
						try {
							InfoColeta infoAnuncio = WImoveisParser
									.obterURLColetaAnuncio(tag);

							if (infoAnuncio != null) {
								urlsDoResultadoPesquisa.add(infoAnuncio);
							}

						} catch (Exception e) {
							e.printStackTrace();
						}
					}

				} catch (IOException e) {
					System.out.println("Erro ao buscar página: " + url);
					e.printStackTrace();
				} catch (InterruptedException e) {
					System.out.println("Erro em Thread.sleep()");
					e.printStackTrace();
				} catch (Exception e) {
					System.out.println("Erro: " + e.getMessage());
					e.printStackTrace();
				} finally {
					paginaAtual++;
				}

			}

		} catch (IOException e) {
			System.out.println("Erro ao obter primeira página!");
			e.printStackTrace();
		}

		return urlsDoResultadoPesquisa;
	}
	
	/**
	 * Realiza a pesquisa no site por um determinado URL Essa pesquisa inicial é
	 * feita apenas para obter o número de páginas retornado na consulta.
	 * 
	 * @param urlPesquisa
	 * @return
	 * @throws IOException
	 */
	private ResultadoPesquisa pesquisar(String urlPesquisa) throws IOException {
		ResultadoPesquisa result = new ResultadoPesquisa();

		Document doc = Jsoup.connect(urlPesquisa).get();

		String query = "#ctl00_Resultado_ResultadoGaleriaUC1_NavegacaoUC1_labelPaginas";
		
		int numPaginas = Integer.parseInt(doc.select(query).first().text());

		System.out.println("NÚMERO DE PÁGINAS: " + numPaginas);

		result.setDocumentoHTML(doc);
		result.setNumPaginas(numPaginas);

		return result;
	}

	/**
	 * Responsável pela coleta de um anuncio na web.
	 * @param url Endereço web do anúncio.
	 * @return Anuncio
	 * @throws Exception
	 */
	public Anuncio coletarAnuncio(String url) throws Exception {
		Document doc = Jsoup.connect(url).get();
		return WImoveisParser.parse(doc);
	}
	
	
//
//	private List<InfoColetaAnuncio> obterURLsAnuncioDoResultadoPesquisaPorListagem(
//			String url) {
//
//		List<InfoColetaAnuncio> urlsDoResultadoPesquisa = new ArrayList<InfoColetaAnuncio>();
//
//		try {
//
//			int numPaginas = pesquisarPorListagem(url).getNumPaginas();
//
//			int paginaAtual = 0;
//
//			// TODO Retirar... foi inserido apenas para não gerar muitas
//			// requisições já que estou fazendo testes...
//			if (numPaginas > 3) {
//				numPaginas = 3;
//			}
//
//			while (paginaAtual < numPaginas) {
//
//				try {
//					System.out.println("************* Obtendo PÁGINA "
//							+ (paginaAtual + 1) + " *************");
//					Document doc2 = Jsoup.connect(url + paginaAtual).get();
//					Thread.sleep(1000);
//
//					Elements tags = doc2.select(".listagem_item");
//
//					for (Element tag : tags) {
//						try {
//							InfoColetaAnuncio infoAnuncio = WImoveisParser
//									.obterURLColetaAnuncio(tag);
//
//							if (infoAnuncio != null) {
//								urlsDoResultadoPesquisa.add(infoAnuncio);
//							}
//
//						} catch (Exception e) {
//							e.printStackTrace();
//						}
//					}
//
//				} catch (IOException e) {
//					System.out.println("Erro ao buscar página: " + url);
//					e.printStackTrace();
//				} catch (InterruptedException e) {
//					System.out.println("Erro em Thread.sleep()");
//					e.printStackTrace();
//				} catch (Exception e) {
//					System.out.println("Erro: " + e.getMessage());
//					e.printStackTrace();
//				} finally {
//					paginaAtual++;
//				}
//
//			}
//
//		} catch (IOException e) {
//			System.out.println("Erro ao obter primeira página!");
//			e.printStackTrace();
//		}
//
//		return urlsDoResultadoPesquisa;
//	}
	
}
